package com.xq.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

/**
 * @author xq
 * @version 1.0
 * @date 2021/4/16 17:21
 * @description 切面类 对类的前置、后缀、循环、异常的增强，不修改源代码的前提下实现
 */
@Aspect // 声明为切面类
@Component
@EnableAspectJAutoProxy // 启用Aspect J自动代理，可不用设置
public class ManAspect {
    /**
     * 声明切入点
     */
    public static final String POINTCUT01 = "execution(* com.xq.aop.method.*.*(..))";

    /**
     * 前置增强代码
     */
//    @Before(POINTCUT01)
    public void before() {
        System.out.println("饭前喝汤");
    }

    /**
     * 后置增强代码
     */
//    @After(POINTCUT01)
    public void after() {
        System.out.println("饭后休息十分钟");
    }

    /**
     * 循环增强代码
     * @param jp
     * @throws Throwable
     */
    @Around(POINTCUT01)
    public Object around(ProceedingJoinPoint jp) throws Throwable {
        // 获取方法中参数集合
        Object[] args = jp.getArgs();
        // 获取第一个参数
        Object arg = args[0];
        // 输出第一个参数的值
        System.out.println("arg[0]："+arg);
        before();
        Object proceed = jp.proceed();
        after();
        return proceed;
    }

    /**
     * 异常增强代码
     * @param tw
     */
    @AfterThrowing(value = POINTCUT01,throwing = "tw")
    public void afterThrowing(Throwable tw) {
        System.out.println("出现异常：" + tw.getMessage());
    }
}
